/**
 * 防抖指令（优化版）
 * 用法：v-debounce.500.immediate="handler" 或 v-debounce:click.500="handler"
 * 参数：
 *   - 数字参数：延迟时间（ms），默认500ms
 *   - 事件类型参数：如 "click"、"input" 等，默认"click"
 * 修饰符：
 *   - immediate: 是否立即执行，默认为false
 *
 * 注意事项：
 *   - 带参数的函数需用箭头函数：v-debounce="() => handle(item)"
 *   - 同一元素请勿重复使用
 */
const debounceDirective = {
  mounted(el, binding) {
    // 1. 解析参数：支持事件类型（如"click"）和延迟时间
    let eventType = binding.arg || 'click'; // 默认事件
    let wait = 500; // 默认延迟
    let immediate = false
    const func = binding.value;

    // 2. 解析修饰符和回调函数
    const configKeyList = Object.keys(binding.modifiers)
    configKeyList.forEach(key => {
      if (!isNaN(Number(key))) {
        wait = Number(key)
      } else if (key === 'immediate') {
        immediate = true
      }
    })
    // 校验回调函数有效性
    if (typeof func !== 'function') {
      console.warn('v-debounce 绑定的值必须是函数');
      return;
    }

    // 3. 创建防抖处理函数并绑定到元素
    el.__debounce_handler__ = debounce(func, wait, immediate, el, binding.instance);
    el.addEventListener(eventType, el.__debounce_handler__);
  },
  updated(el, binding, vnode, prevVnode) {
    console.log(el, binding);
  },
  beforeUnmount(el, binding) {
    // 清除定时器和事件监听，避免内存泄漏
    const eventType = binding.arg || 'click';
    if (el.__debounce_timer__) {
      clearTimeout(el.__debounce_timer__);
      el.__debounce_timer__ = null;
    }
    if (el.__debounce_handler__) {
      el.removeEventListener(eventType, el.__debounce_handler__);
      el.__debounce_handler__ = null; // 彻底释放引用
    }
  }
};

// 防抖核心函数（独立提取，避免重复代码）
const debounce = (func, wait, immediate, el, instance) => {
  return function (event) {
    // 清除已有定时器
    if (el.__debounce_timer__) {
      clearTimeout(el.__debounce_timer__);
    }

    // 立即执行逻辑
    const shouldCallNow = immediate && !el.__debounce_timer__;
    if (shouldCallNow) {
      func.call(instance, event);
    }

    // 设置新定时器（延迟执行）
    el.__debounce_timer__ = setTimeout(() => {
      // 非立即执行时，延迟后调用
      if (!immediate) {
        func.call(instance, event);
      }
      el.__debounce_timer__ = null; // 执行后清空定时器
    }, wait);
  };
}

export default debounceDirective;
